/******************************************************************************
 *
 * This is C-LOVE
 *
 * 文件名: CLMasonry   1.0.0
 *
 * 说 明: 代码约束
 *       基于Msaonry 的封装
 *       把枯燥的代码  通过 自己喜欢的方式 封装一遍  运行效率自然不会提高  但可读性各方面就会提高了
 *
 ******************************************************************************/

#import "CLMasonry.h"


@implementation CLMasonry

/**
 * @abstract   视图约束
 *
 * @discussion 视图约束时视图必须先提前添加到相应的视图内(如果没有则可能会造成奔溃)
 *             top,bottom,left,right,width,height 数值为 'CLNIL' 时表示不进行约束
 *
 * @param  view       需要约束的视图
 * @param  baseView   基视图(参照视图)
 * @param  top        顶部之间距离
 * @param  bottom     底部之间距离
 * @param  left       左边之间距离
 * @param  right      右边之间距离
 * @param  width      视图(需要约束的视图)宽度
 * @param  height     视图(需要约束的视图)高度
 */
+ (void)masonry:(UIView *)view        /* 当前视图  */
       baseView:(UIView *)baseView    /* 相距的视图 */
             top:(CGFloat)top
          bottom:(CGFloat)bottom
            left:(CGFloat)left
           right:(CGFloat)right
           width:(CGFloat)width
          height:(CGFloat)height {
    if(view == nil){
        return;
    }
    [view mas_makeConstraints:^(MASConstraintMaker *make) {
        if(top    != CLNIL && baseView != nil) { //topView 的上边距，距离self.view的上边距为0
            make.top.equalTo(baseView.mas_top).with.offset(top);
        }
        if(bottom != CLNIL && baseView != nil) { //topView 的下边距，距离self.view的上边距为0
            make.bottom.equalTo(baseView.mas_bottom).with.offset(-bottom);
        }
        if(left   != CLNIL && baseView != nil) { //topView 的左边距，距离self.view的上边距为0
            make.left.equalTo(baseView.mas_left).with.offset(left);
        }
        if(right  != CLNIL && baseView != nil) { //topView 的右边距，距离self.view的上边距为0
            make.right.equalTo(baseView.mas_right).with.offset(-right);
        }
        if(width  != CLNIL) { //设置宽度
            make.width.equalTo([NSNumber numberWithFloat:width]);
        }
        if(height != CLNIL) { //设置高度
            make.height.equalTo([NSNumber numberWithFloat:height]);
        }
    }];
}


/**
 * @abstract   视图约束
 *
 * @discussion 视图约束时视图必须先提前添加到相应的视图内(如果没有则可能会造成奔溃)
 *             top,bottom,left,right 数值为 'CLNIL' 时表示不进行约束
 *
 * @param  view       需要约束的视图
 * @param  baseView   基视图(参照视图)
 * @param  top        顶部之间距离
 * @param  bottom     底部之间距离
 * @param  left       左边之间距离
 * @param  right      右边之间距离
 */
+ (void)masonry:(UIView *)view
       baseView:(UIView *)baseView
             top:(CGFloat)top
          bottom:(CGFloat)bottom
            left:(CGFloat)left
           right:(CGFloat)right {
    [CLMasonry masonry:view
              baseView:baseView
                   top:top
                bottom:bottom
                  left:left
                 right:right
                 width:CLNIL
                height:CLNIL];
}

/**
 * @abstract   约束视图的宽度和高度
 *
 * @discussion 视图约束时视图必须先提前添加到相应的视图内(如果没有则可能会造成奔溃)
 *             此函数只对视图的高度和宽度进行约束 width，height 的数值为'CLNIL'时表示不作约束
 *
 * @param  view    需要约束的视图
 * @param  width   视图宽度
 * @param  height  视图高度
 */
+ (void)widthAndHeightOfView:(UIView *)view
                       width:(CGFloat)width
                      height:(CGFloat)height {
    [CLMasonry masonry:view
              baseView:nil
                   top:CLNIL
                bottom:CLNIL
                  left:CLNIL
                 right:CLNIL
                 width:width
                height:height];
}

/**
 * @abstract   视图约束顶部之间的距离
 *
 * @discussion 视图约束时视图必须先提前添加到相应的视图内(如果没有则可能会造成奔溃)
 *             对视图之间(view, baseView)的顶部之间的距离约束。
 *
 * @param  view      需要约束的视图
 * @param  baseView  基视图(参照视图)
 * @param  top       顶部之间的距离
 */
+ (void)topDistance:(UIView *)view
           baseView:(UIView *)baseView
                top:(CGFloat)top {
    [CLMasonry masonry:view
              baseView:baseView
                   top:top
                bottom:CLNIL
                  left:CLNIL
                 right:CLNIL
                 width:CLNIL
                height:CLNIL];
}

/**
 * @abstract   视图约束底部之间的距离
 *
 * @discussion 视图约束时视图必须先提前添加到相应的视图内(如果没有则可能会造成奔溃)
 *             对视图之间(view, baseView)的底部之间的距离约束。
 *
 * @param  view      需要约束的视图
 * @param  baseView  基视图(参照视图)
 * @param  bottom    底部之间的距离
 */
+ (void)bottomDistance:(UIView *)view
              baseView:(UIView *)baseView
                bottom:(CGFloat)bottom {
    [CLMasonry masonry:view
              baseView:baseView
                   top:CLNIL
                bottom:bottom
                  left:CLNIL
                 right:CLNIL
                 width:CLNIL
                height:CLNIL];
}

/**
 * @abstract   视图约束左边之间的距离
 *
 * @discussion 视图约束时视图必须先提前添加到相应的视图内(如果没有则可能会造成奔溃)
 *             对视图之间(view, baseView)的左边之间的距离约束。
 *
 * @param  view      需要约束的视图
 * @param  baseView  基视图(参照视图)
 * @param  left      左边之间的距离
 */
+ (void)leftDistance:(UIView *)view
            baseView:(UIView *)baseView
                left:(CGFloat)left {
    [CLMasonry masonry:view
              baseView:baseView
                   top:CLNIL
                bottom:CLNIL
                  left:left
                 right:CLNIL
                 width:CLNIL
                height:CLNIL];
}

/**
 * @abstract   视图约束右边之间的距离
 *
 * @discussion 视图约束时视图必须先提前添加到相应的视图内(如果没有则可能会造成奔溃)
 *             对视图之间(view, baseView)的右边之间的距离约束。
 *
 * @param  view      需要约束的视图
 * @param  baseView  基视图(参照视图)
 * @param  right     右边之间的距离
 */
+ (void)rightDistance:(UIView *)view
             baseView:(UIView *)baseView
                right:(CGFloat)right {
    [CLMasonry masonry:view
              baseView:baseView
                   top:CLNIL
                bottom:CLNIL
                  left:CLNIL
                 right:right
                 width:CLNIL
                height:CLNIL];
}

/**
 * @abstract   视图约束宽度
 *
 * @discussion 视图约束时视图必须先提前添加到相应的视图内(如果没有则可能会造成奔溃)
 *             对视图宽度约束。
 *
 * @param  view   需要约束的视图
 * @param  width  视图宽度
 */
+ (void)widthOfView:(UIView *)view
              width:(CGFloat)width {
    [CLMasonry masonry:view
              baseView:nil
                   top:CLNIL
                bottom:CLNIL
                  left:CLNIL
                 right:CLNIL
                 width:width
                height:CLNIL];
}

/**
 * @abstract   视图约束高度
 *
 * @discussion 视图约束时视图必须先提前添加到相应的视图内(如果没有则可能会造成奔溃)
 *             对视图高度约束。
 *
 * @param  view   需要约束的视图
 * @param  height 视图高度
 */
+ (void)heightOfView:(UIView *)view
              height:(CGFloat)height {
    [CLMasonry masonry:view
              baseView:nil
                   top:CLNIL
                bottom:CLNIL
                  left:CLNIL
                 right:CLNIL
                 width:CLNIL
                height:height];
}

/**
 * @abstract   对视图的一个方向进行约束
 *
 * @discussion 视图约束时视图必须先提前添加到相应的视图内(如果没有则可能会造成奔溃)
 *             需要约束的一个方向，与基视图的一个方向进行约束。
 *
 * @param  view           需要约束的视图
 * @param  viewDirection  需啊约束的视图的方向
 * @param  baseView       基视图(参照视图)
 * @param  baseVDirection 基视图的方向
 * @param  distance       约束的距离
 */
+ (void)masonry:(UIView *)view
      direction:(CLDirection)viewDirection
       baseView:(UIView *)baseView
      direction:(CLDirection)baseVDirection
       distance:(CGFloat)distance {
    id baseViewAttribute;
    switch (baseVDirection) {
        case CLDirectionTop:
            baseViewAttribute = baseView.mas_top;
            break;
        case CLDirectionBottom:
            baseViewAttribute = baseView.mas_bottom;
            distance = -distance;
            break;
        case CLDirectionLeft:
            baseViewAttribute = baseView.mas_left;
            break;
        case CLDirectionRight:
            baseViewAttribute = baseView.mas_right;
            distance = -distance;
            break;
    }
    [view mas_makeConstraints:^(MASConstraintMaker *make) {
        switch (viewDirection) {
            case CLDirectionTop:
                make.top.   equalTo(baseViewAttribute).with.offset(distance);
                break;
            case CLDirectionBottom:
                make.bottom.equalTo(baseViewAttribute).with.offset(distance);
                break;
            case CLDirectionLeft:
                make.left.  equalTo(baseViewAttribute).with.offset(distance);
                break;
            case CLDirectionRight:
                make.right. equalTo(baseViewAttribute).with.offset(distance);
                break;
        }
    }];
}


/**
 * @abstract   约束视图之间宽度相等
 *
 * @param  view     需要约束的视图
 * @param  baseView 基视图(参照视图)
 */
+ (void)widthEqual:(UIView *)view
          baseView:(UIView *)baseView {
    [view mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width.equalTo(baseView.mas_width);
    }];
}

/**
 * @abstract   按比例约束视图之间宽
 *
 * @param  view       需要约束的视图
 * @param  baseView   基视图(参照视图)
 * @param  multiplied 宽比例 (view.width : baseView.width)
 */
+ (void)widthEqual:(UIView *)view
          baseView:(UIView *)baseView
        multiplied:(CGFloat)multiplied {
    [view mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width.equalTo(baseView.mas_width).multipliedBy(multiplied);
    }];
}


/**
 * @abstract   约束视图之间高度相等
 *
 * @param  view     需要约束的视图
 * @param  baseView 基视图(参照视图)
 */
+ (void)heightEqual:(UIView *)view
           baseView:(UIView *)baseView {
    [view mas_makeConstraints:^(MASConstraintMaker *make) {
        make.height.equalTo(baseView.mas_height);
    }];
}

/**
 * @abstract   按比例约束视图之间高
 *
 * @param  view       需要约束的视图
 * @param  baseView   基视图(参照视图)
 * @param  multiplied 高比例 (view.height : baseView.height)
 */
+ (void)heightEqual:(UIView *)view
           baseView:(UIView *)baseView
         multiplied:(CGFloat)multiplied {
    [view mas_makeConstraints:^(MASConstraintMaker *make) {
        make.height.equalTo(baseView.mas_height).multipliedBy(multiplied);
    }];
}



/**
 * @abstract   约束视图之间高度和宽度都相等
 *
 * @param  view     需要约束的视图
 * @param  baseView 基视图(参照视图)
 */
+ (void)widthAndHeightEqual:(UIView *)view
                   baseView:(UIView *)baseView {
    [view mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width. equalTo(baseView.mas_width);
        make.height.equalTo(baseView.mas_height);
    }];
}

/**
 * @abstract   按比例约束视图之间高和宽
 *
 * @param  view             需要约束的视图
 * @param  baseView         基视图(参照视图)
 * @param  heightMultiplied 高度比例 (view.height : baseView.height)
 * @param  widthMultiplied  宽度比例 (view.width  : baseView.width )
 */
+ (void)widthAndHeightEqual:(UIView *)view
                   baseView:(UIView *)baseView
            widthMultiplied:(CGFloat)widthMultiplied
           heightMultiplied:(CGFloat)heightMultiplied {
    [view mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width. equalTo(baseView.mas_width). multipliedBy(widthMultiplied);
        make.height.equalTo(baseView.mas_height).multipliedBy(heightMultiplied);
    }];
}



/// multipliedBy


@end


